package cn.signalpha.common.utils;

/**
 *
 * 经纬度工具类
 *
 * @author signalpha
 */
public class DistanceUtil {

	/**
	 * 地球平均半径，单位：公里
	 */
	private static final double RADIUS_OF_EARTH_KM = 6371.0;

	/**
	 * 计算两个经纬度之间的距离，使用Haversine公式，单位：公里。
	 *
	 * @param lat1 第一个点的纬度
	 * @param lng1 第一个点的经度
	 * @param lat2 第二个点的纬度
	 * @param lng2 第二个点的经度
	 * @return 两点之间的距离，单位：公里
	 */
	public static double calculateHaversineDistance(double lat1, double lng1, double lat2, double lng2) {
		// 将十进制度数转化为弧度
		double latDistance = Math.toRadians(lat2 - lat1);
		double lonDistance = Math.toRadians(lng2 - lng1);
		double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
			+ Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
			* Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
		double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
		return RADIUS_OF_EARTH_KM * c;
	}
}
